package aspects;


import java.awt.List;
import java.util.ArrayList;
import java.util.HashMap;

import domain.Persona;
import domain.Validador;
import domain.ValidadorDeVariable;
import domain.ValidadorStringNoVacio;

public aspect ValidadorAspect {
    public ArrayList<ValidadorDeVariable> validadores = new ArrayList<ValidadorDeVariable>();
//	public HashMap<Persona, ValidadorDeVariable> validadores = new HashMap<Persona, ValidadorDeVariable>();

	pointcut fieldWrite(Object target, String newValue):
		set(* domain.*.*) && args(newValue) && target(target);

	void around(Object target, String newValue) : fieldWrite(target, newValue) {
		String variable = thisJoinPoint.getSignature().getName();
		System.out.println("entro aca");
		if(this.tieneValidador(target,variable)){
			if (this.getValidador(target, variable).validar(newValue)) {
				System.out.println("paso por aca");
				proceed(target, newValue);
			}}
		else{
			proceed(target,newValue);
		}
	}

	private Validador getValidador(Object target, String variable) {
		for(ValidadorDeVariable validador : this.validadores){
			if(validador.esElObjeto(target) && validador.esLaVariable(variable)){
				return validador.validador;
			}
		}
		return null;	
	}

	private boolean tieneValidador(Object target,String variable) {
		for(ValidadorDeVariable validador : this.validadores){
			if(validador.esElObjeto(target) && validador.esLaVariable(variable)){
				return true;
			}
		}
			return false;
	}

    public void agregarValidador(Persona p1, String string,
			Validador validador) {
		this.validadores.add(new ValidadorDeVariable(p1, string, validador));	
	}
    
}
